package tech.wangtong.util;

import org.apache.commons.io.FileUtils;
import org.springframework.http.HttpHeaders;
import org.springframework.http.HttpStatus;
import org.springframework.http.MediaType;
import org.springframework.http.ResponseEntity;
import org.springframework.web.multipart.MultipartFile;

import javax.servlet.http.HttpServletRequest;
import java.io.File;
import java.io.IOException;
import java.net.URLEncoder;
import java.util.UUID;

//实现文件上传和下载的工具类
//只适用于SSM框架
public class UpDownUtil {
    //上传的方法
    public static String upload(MultipartFile file, HttpServletRequest req){
        //不能将上传的文件名直接存储到服务器(可能会重名替换)
        //所以文件名需要随机处理(uuid,时间戳,随机数)
        //获取上传文件的名称
        String filename = file.getOriginalFilename();
        if (filename.equals("")) return null;
        //2.生成新文件名(后缀不变,文件名随机处理)
        String suffix=filename.substring(filename.lastIndexOf("."));
        //UUID生成32位永不重复的字符串
        String prefix= UUID.randomUUID().toString();
        String newFileName=prefix+suffix;
        //如果上传到云服务器(文件服务器),这里就可以发送请求
        //访问云服务器,传递数据过去
        //如果上传后端本地服务器,需要获取服务器的本地地址
        String path = req.getServletContext().getRealPath("/upload/");

        File f=new File(path);
        if (!f.exists()) f.mkdirs();
        //上传文件
        try {
            file.transferTo(new File(path+newFileName));
            //数据库只需要存文件地址或者文件名
        } catch (Exception e) {
            e.printStackTrace();
        }
        return newFileName;
    }
    public static ResponseEntity<byte[]> download(String filename,HttpServletRequest request){
        ResponseEntity<byte[]> re = null;
        try {
            //1.获取头部信息
            HttpHeaders headers = new HttpHeaders();
            //2.通过头部信息设置文档类型  设置成流
            headers.setContentType(MediaType.APPLICATION_OCTET_STREAM);
            //用于保存文件字节数据
            byte[] bs = new byte[0];
            //2.1设置文件名的编码格式 如果文件名是中文 也可以识别
            filename = URLEncoder.encode(filename, "UTF-8");
            //3.指定附件形式的下载（还要指定下载的文件名）
            headers.setContentDispositionFormData("attachment", filename);
            //4.获取下载的文件对象
            String path = request.getServletContext().getRealPath("/upload/");
            File file = new File(path+filename);
            //5.将下载的文件对象转换成字节数组
            bs= FileUtils.readFileToByteArray(file);
            //6.封装所有数据,ResponseEntity返回（字节数组，头部信息，状态）
            re = new ResponseEntity<>(bs,headers, HttpStatus.CREATED);
        } catch (IOException e) {
            throw new RuntimeException(e);
        }
        return re;
    }
}
